/*******************************************************************************
 * @file myusart.c
 *******************************************************************************
 * 自定义串口协议
 * 帧定义：
 * |  1  |   2   |   3    |   4  |   5   |
 * |1字节| 1字节 |  1字节 | 可变 | 1字节 |
 * |帧头 |  命令 |数据长度| 数据 |  帧尾 |
 *******************************************************************************
 * 命令功能定义
 * 0x00 控制板子上的 LED 开关，数据长度 1，0x00->灭 0x01->亮
 * 0x01 控制板子 LED 闪烁开关，数据长度 1，0x00-> 闪烁 0x01->不闪烁
 * 0x02 接收浮点数测试，数据长度 4，把浮点数转换为 16进制后通过串口助手发给单片机
 */
#include "myusart.h"
#include "usart.h"
#include "led.h"
#include <stdio.h>

uint8_t rbuf[RBUF_LEN] = {0};
float p = 0.0;

MyUsart_t my_usart = {
	.data_len = 0, 			// 数据域长度
	.frame_end_index = 0, 	// 帧尾索引
	.led_blink_flag = 0, 	// led 闪烁标志位
};

// 定义从串口接收到的4个字节的浮点数转为浮点数
typedef union 
{
	struct SB
	{
		uint8_t b3;
		uint8_t b2;
		uint8_t b1;
		uint8_t b0;
	} bb;
	float p;
} P_t;

P_t pt;

/*******************************************************************************
 * @biref  从串口接收数据
 * @retval None
 *******************************************************************************
 */
void my_usart_receive(void)
{
	uint8_t rtemp;
	uint8_t index = 0;
	HAL_UART_Receive(&huart2, &rtemp, 1, 10);
	
	if (rtemp == FRAME_START)
	{	
		rbuf[index++] = rtemp; // 帧头
		
		HAL_UART_Receive(&huart2, &rtemp, 1, 10);
		rbuf[index++] = rtemp; // 命令
		
		HAL_UART_Receive(&huart2, &rtemp, 1, 10);
		rbuf[index++] = rtemp; // 数据长度
		my_usart.data_len = rtemp;
		
		for(int i = rbuf[2]; i>=0; i--)
		{
			HAL_UART_Receive(&huart2, &rtemp, 1, 10);
			rbuf[index++] = rtemp; // 数据长度
		}
		
		HAL_UART_Receive(&huart2, &rtemp, 1, 10);
		rbuf[index++] = rtemp; // 帧尾
		my_usart.frame_end_index = index-1;
	}
}

/*******************************************************************************
 * @biref 	解析接收缓存 rbuf 中的数据
 * @param 	rbuf 接收数据的缓存指针
 * @param 	data_len 数据域的数据长度，在 MyUsart_t 结构体中
 * @retval 	None
 *******************************************************************************
 */
void my_uart_parse(uint8_t *rbuf, uint8_t data_len)
{
	if (rbuf[0] == 0x5A && rbuf[my_usart.frame_end_index] == 0xA5)
	{
		switch(rbuf[1])
		{
			case 0x00: // 0x00 LED命令处理

				if (rbuf[2] == 0x01) // 数据长度
				{
					if(rbuf[3] == 0x00)
					{
						LED_OFF();
					}
					if(rbuf[3] == 0x01)
					{
						LED_ON();
					}
				}
			break;
			case 0x01:// led 闪烁命令
				
				if (rbuf[2] == 0x01) // 数据长度
				{
					if(rbuf[3] == 0x00) // 启动闪烁
					{
						
						my_usart.led_blink_flag = 1;
					}
					if(rbuf[3] == 0x01) // 关闭闪烁
					{
						my_usart.led_blink_flag = 0;
					}
				}
				
			break;
			case 0x02: // 接收浮点数
				
				if (rbuf[2] == 0x04) // 数据长度
				{
					pt.bb.b0 = rbuf[3];
					pt.bb.b1 = rbuf[4];
					pt.bb.b2 = rbuf[5];
					pt.bb.b3 = rbuf[6];
				}
				printf("%f", pt.p);
			break;
		}
	}
	
	// 清除帧头和帧尾
	rbuf[0] = 0;
	rbuf[my_usart.frame_end_index] = 0;
}
